from rest_framework import serializers

from list.models import Teacher, Course,CourseChapter,CourseLesson


class TeacherSerializer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        fields = ['name', 'title']


class CourseSerializer(serializers.ModelSerializer):
    # 嵌套 序列化讲师的信息
    teacher = TeacherSerializer(read_only=True)

    # 自定义字段:付费类型
    course_type_text = serializers.SerializerMethodField()

    class Meta:
        model = Course
        fields = ['id', 'course_img', 'name', 'brief', 'teacher', 'students', 'lessons', 'course_type',
                  'course_type_text',
                  'original_price', 'price']

    def get_course_type_text(self, obj):
        return obj.get_course_type_display()






# 因为以上都是课程展示的序列化器，我们也可以继续沿用上面的数据，但为了好区分，在定义详情页专用的序列化器
# 仔细想想一个详情页面有哪些展示内容：1.老师信息 2.课程信息 3.课时信息 4.课程章节信息
# 这里的课程与课程章节/课程章节与课时 都为一对多的关系，所以我们需要从一表中向多表进行查询，
# 需要用到反向查询的related_name构建序列化条件

# 构建老师序列化器
class TeacherDetailSer(serializers.ModelSerializer):
    class Meta:
        model = Teacher
        fields = '__all__'



# 构建课时序列化器
class CourseLessonSer(serializers.ModelSerializer):

    class Meta:
        model = CourseLesson
        fields = '__all__'


# 构建课程章节序列化器
class CourseChapterSer(serializers.ModelSerializer):

    # 构建反向查询序列化条件
    lessons = CourseLessonSer(read_only=True, many=True)

    class Meta:
        model = CourseChapter
        fields = '__all__'




# 构建课程序列化器：
class CourseDetailSerializer(serializers.ModelSerializer):
    teacher = TeacherDetailSer(read_only=True)
    # 构建反响查询的条件-->这是一条链子：反向从课程表向课程章节表进行查询，再向课程章节表的课时表进行查询
    chapters = CourseChapterSer(read_only=True,many=True)
    # 这里的chapters一定是你定义的related_name，否则会报错

    # 别忘记定义元选项：
    class Meta:
        model = Course
        fields = '__all__'